import router from '@/router'
import { storeToRefs } from 'pinia'
import { useMenuStore } from '@/stores/menu'
import { useEventBus } from '@vueuse/core'
import { useThemeStore } from '@/stores/theme'

export function useTabbar() {
  const menuStroe = useMenuStore()
  const { tabbarList, keepAliveList, allRoutesFlat } = storeToRefs(menuStroe)

  const themeStore = useThemeStore()
  const { isMaximize } = storeToRefs(themeStore)

  /**
   * 删除标签 - 辅助函数
   * @param {Object} tab 标签对象
   */
  const removeTab = (tab) => {
    // 更新 tabbarList
    tabbarList.value = tabbarList.value.filter((item) => item.path !== tab.path)

    // 删除 keepAlive
    removeKeepAlive(tab)
  }

  /**
   * 自动跳转 - 辅助函数
   * @description 当tab被删后，可能需要自动跳转，优先跳转级：下一个nextTab > 上一个lastTab > 首页/
   * @param {Object} tab 要跳转的标签对象
   */
  const autoSkipNextOrLast = (tab) => {
    // 无标签对象时直接跳转首页
    if (!tab) {
      router.push('/')
      return
    }

    // 当前currentRoute是否被删
    const isExist = tabbarList.value.some((item) => item.path === router.currentRoute.value.path)

    if (!isExist) {
      // 寻找到需要跳转的tab
      router.push(tab.path)
    }
  }

  /**
   * 新增keepAlive
   * @param {Object} tab 标签对象
   */
  function addKeepAlive(tab) {
    if (tab.meta.keepAlive && !keepAliveList.value.includes(tab.name)) {
      keepAliveList.value.push(tab.name)
    }
  }

  /**
   * 删除keepAlive
   * @param {Object} tab 标签对象
   */
  function removeKeepAlive(tab) {
    if (tab.meta.keepAlive && keepAliveList.value.includes(tab.name)) {
      keepAliveList.value = keepAliveList.value.filter((item) => item !== tab.name)
    }
  }

  /**
   * 刷新缓存
   */
  function refreshKeepAlive() {
    keepAliveList.value = keepAliveList.value.filter((item) => tabbarList.value.some((i) => i.name === item))
  }

  /**
   * 添加标签
   * @param {Object} tab 标签对象
   * @param {String} mode 添加模式 unshift | push
   */
  function addTab(tab, mode = 'push') {
    const isExist = tabbarList.value.some((item) => item.path === tab.path)
    if (!isExist) {
      if (mode == 'unshift') {
        tabbarList.value.unshift(tab)
      } else {
        tabbarList.value.push(tab)
      }
    }

    // 添加 keepAlive
    addKeepAlive(tab)
  }

  /**
   * 关闭标签
   * @param {Object} tab 要关闭的标签对象
   */
  function closeTab(tab) {
    const tabIndex = tabbarList.value.findIndex((item) => item.path === tab.path)
    let nextTab = tabbarList.value[tabIndex + 1]
    let lastTab = tabbarList.value[tabIndex - 1]

    // 删除标签
    removeTab(tab)

    // 自动跳转
    autoSkipNextOrLast(nextTab || lastTab)
  }

  /**
   * 固定标签
   * @param {Object} tab 标签对象
   */
  function affixTab(tab) {
    const tabIndex = tabbarList.value.findIndex((item) => item.path === tab.path)
    if (tabIndex > -1) {
      tabbarList.value[tabIndex].meta.affix = true
    }
  }

  /**
   * 解锁固定标签
   * @param {Object} tab 标签对象
   */
  function unfixTab(tab) {
    const tabIndex = tabbarList.value.findIndex((item) => item.path === tab.path)
    if (tabIndex > -1) {
      tabbarList.value[tabIndex].meta.affix = false
    }
  }

  /**
   * 关闭右侧
   * @description 固定标签无法关闭
   * @param {Object} tab 当前标签对象
   */
  function closeRightTabs(tab) {
    // 固定标签和右侧标签不可关闭
    const tabIndex = tabbarList.value.findIndex((item) => item.path === tab.path)
    tabbarList.value = tabbarList.value.filter((item, index) => index <= tabIndex || item.meta.affix)

    // 更新 keepAlive
    refreshKeepAlive()

    // 自动跳转
    autoSkipNextOrLast(tab)
  }

  /**
   * 关闭左侧
   * @description 固定标签无法关闭
   * @param {Object} tab 当前标签对象
   */
  function closeLeftTabs(tab) {
    // 固定标签和左侧标签不可关闭
    const tabIndex = tabbarList.value.findIndex((item) => item.path === tab.path)
    tabbarList.value = tabbarList.value.filter((item, index) => index >= tabIndex || item.meta.affix)

    // 更新 keepAlive
    refreshKeepAlive()

    // 自动跳转
    autoSkipNextOrLast(tab)
  }

  /**
   * 关闭其他
   * @description 固定标签无法关闭
   * @param {Object} tab 当前标签对象
   */
  function closeOtherTabs(tab) {
    // 固定标签和当前标签不可关闭
    tabbarList.value = tabbarList.value.filter((item) => item.meta.affix || item.path === tab.path)

    // 更新 keepAlive
    refreshKeepAlive()

    // 自动跳转
    autoSkipNextOrLast(tab)
  }

  /**
   * 关闭所有
   * @description 固定标签无法关闭
   */
  function closeAllTabs() {
    // 固定标签不可关闭
    tabbarList.value = tabbarList.value.filter((item) => item.meta.affix)

    // 更新 keepAlive
    refreshKeepAlive()

    // 自动跳转
    autoSkipNextOrLast()
  }

  /**
   * 初始化标签
   * @description 初始化路由表中所有固定的标签，需追加至 tabbarList 前面
   */
  function initTabs() {
    const affixTabs = allRoutesFlat.value.filter((item) => item.meta.affix) // 筛选出固定标签
    const reverseTabs = affixTabs.map((i) => ({ path: i.path, name: i.name, meta: i.meta })).reverse() // 需反转一下顺序
    reverseTabs.forEach((item) => {
      addTab(item, 'unshift')
    })
  }

  // 刷新事件分发
  const e_refresh_page = useEventBus('E_REFRESH_PAGE')
  /**
   * 刷新当前页面
   * @param {Object} tab 当前标签对象
   */
  function refreshCurrentPage(tab) {
    // 先查询当前页面路由是否就是该tab，若是则直接刷新，若不是则先跳转至该tab页
    if (router.currentRoute.value.path !== tab.path) {
      router.push(tab.path)
    }

    // 分发刷新事件
    e_refresh_page.emit(tab)
  }

  /**
   * 最大化当前页面
   * @param {Object} tab 当前标签对象
   * @param {Boolean} isMax 是否全屏
   */
  function maximizeCurrentPage(tab, isMax = true) {
    // 先查询当前页面路由是否就是该tab，若是则直接最大化，若不是则先跳转至该tab页
    if (router.currentRoute.value.path !== tab.path) {
      router.push(tab.path)
    }
    isMaximize.value = isMax
  }

  return {
    addKeepAlive,
    removeKeepAlive,
    refreshKeepAlive,
    addTab,
    closeTab,
    affixTab,
    unfixTab,
    closeOtherTabs,
    closeAllTabs,
    closeRightTabs,
    closeLeftTabs,
    initTabs,
    refreshCurrentPage,
    maximizeCurrentPage,
  }
}
